汇编assume 您所在的位置:网站首页 assume 汇编语言 汇编assume

汇编assume

2023-11-20 01:53| 来源: 网络整理| 查看: 265

引用自浙江大学白洪欢老师的解释。

assume只是对编译器编译程序起作用,并不能对段寄存器进行实际的赋值。 assume的目的是为了在编译时确定变量的段地址。 比如你在data段里定义了一个变量叫abc,然后你在 code段里引用了此变量,比如: mov ah, [abc] 或者 mov ah, abc 那么在编译的时候,编译器首先计算出abc的偏移地址假定为0, 然后还要确定abc的段地址data与哪个段寄存器对应。如果你 assume ds:data,那么,编译出来的结果是: mov ah, ds:[0000] 如果你assume es:data,那么编译出来的结果是: mov ah, es:[0000] 如果你assume ds:data, es:data,这里就有个优先的问题, ds的优先级高于es,所以编译出来的结果仍旧是: mov ah, ds:[0000]

 

assume不对段寄存器进行赋值的,只是帮助编译器确定变量的段地址。假定变量abc的偏移地址是0,段地址是data,那么在编译   mov ah, [abc] 这句话时,变量名abc肯定要被替换成实际的段地址及偏移地址   mov ah, data:[0000] 但是,我们知道,段地址data本身不能用来表示指令中的段地址,必须用一个段寄存器来代替才行。所以,此时编译器需要选择ds、es、ss、cs中 的其中一个来代替data。它的选择决定于你是怎么assume的,而完全不管程序执行的时候这些段寄存器的值是否等于data(事实上编译的时候程序还没有 运行,编译器怎么可能知道4个段寄存器的值?)。 因此,把   mov ah, [abc] 编译成   mov ah, ds:[0000] 是因为你前面assume ds:data。如果你没有assume的话,编译会出错,因为变量所在段虽然是data,但是它不知道该用哪个段寄存器来代替data。这是出错

的主要原因。注意这里编译出来的 mov ah, ds:[0000] 中,ds这个段寄存器的值本身不会自动 被赋值为data的。

========================================以下为个人补充============================================================

但是如果你在使用[abc]时,都手动指定ds:[abc],并且你在程序的一开始就把data的地址赋值给ds的话,也是可以的。例如:

data segment     char db 'a' data ends code segment assume cs:code main:    mov ax, data    mov ds, ax    mov ah, ds:[char]    mov ah, 4ch    int 21h code ends end main



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有